An application program can be broken into threads, which are sequences of instructions, such as executable units, that are executed on the Central Processing Unit (CPU) of a computer. Generally, a program is first divided into software threads by the operating system, then each software thread is mapped or scheduled onto a corresponding hardware thread in a CPU, which are typically sets of registers in a CPU. To process the threads at a faster rate, multi-threaded processors can be used which can concurrently receive and process multiple threads at a given time.
During software thread creation, some threads may be deemed to have a higher priority associated with them than others. The operating system thus prioritizes software threads based on desired performance characterizations. One method of thread prioritization by the operating system is the time-slice method used today by multi-processing systems. In this method, a software thread with higher priority receives more frequent time slices than one with a lower priority, and is more tended to by the multi-processing system, thus often achieving better performance.
While in use with multi-processing systems, the foregoing prioritizing method is ineffective in multi-threaded environments, where resources are equally contended among concurrently executing threads. The problem arises when the prioritized software threads are mapped into hardware threads for processing by a multi-threaded processor. Currently, multi-threaded processors treat each hardware thread equally despite their assigned software level priority, thus reducing the effectiveness of the initial operating system prioritization of the threads.
One reason for such shortcoming in the prior art lies with the cache system of the multi-threaded processor. Traditionally, cache replacement algorithms used for operating the cache system have been designed to provide symmetric treatment to all threads. In symmetric multi-processing systems, however, concurrent execution of various tasks of hardware threads (i.e. without prioritization) usually compromises performance, especially of real-time threads which are often given high priorities by the software. This can be an impediment in workstation and home offices when many routine maintenance tasks, such as disk fragmentation and virus scan run concurrently with real time tasks such as multi-media decoding.